package fiuba.algo3.partida;

import org.jdom2.Element;

import fiuba.algo3.dificultad.DificultadAlta;
import fiuba.algo3.dificultad.DificultadBaja;
import fiuba.algo3.dificultad.DificultadBase;
import fiuba.algo3.dificultad.DificultadDePartida;
import fiuba.algo3.dificultad.DificultadMedia;
import fiuba.algo3.mapa.Calle;
import fiuba.algo3.mapa.Esquina;
import fiuba.algo3.mapa.Mapa;
import fiuba.algo3.vehiculo.Conductor;
import fiuba.algo3.vehiculo.Vehiculo;

public class Partida {
	private DificultadDePartida miDificultad;
	private Conductor miConductor;
	private Mapa unMapa;
	private String usuario;
	
	public Partida(DificultadDePartida unaDificultad) {
		this.miConductor = null;
		this.unMapa = unaDificultad.crearMapaConDificultad();
		this.miDificultad = unaDificultad;
	}

	public Mapa getMapa() {
		return this.unMapa;
	}

	public Boolean vehiculoEnLlegada() {
		return (miConductor.getUbicacion() == unMapa.getLlegada());
	}

	public Conductor getConductor() {
		return miConductor;
	}

	public void cargarVehiculoEnMapa(Vehiculo unVehiculo) {
		Conductor miConductor = new Conductor();
		miConductor.cambiarDeVehiculo(unVehiculo);
		miConductor.setUbicacion(unMapa.getLargada());
		this.miConductor = miConductor;
	}
	
	public void cargarConductorEnMapa(Conductor unConductor){
		unConductor.setUbicacion(unMapa.getLargada());
		this.miConductor = unConductor;
	}

	public Boolean esquinaEsVisible(Esquina unaEsquina) {
		if (unaEsquina == this.unMapa.getLlegada())
			return true;
		int distancia = miConductor.getUbicacion().calcularDistanciaAEsquina(unaEsquina);
		return (distancia <= 2);
	}

	public Boolean calleEsVisible(Calle unaCalle) {
		return (this.esquinaEsVisible(unaCalle.obtenerEsquinas()[0]) && this.esquinaEsVisible(unaCalle.obtenerEsquinas()[1]));
	}

	public void moverVehiculoArriba() {
		this.getConductor().moverVehiculoOeste();
	}

	public void moverVehiculoDerecha() {
		this.getConductor().moverVehiculoSur();
	}

	public void moverVehiculoIzquierda() {
		this.getConductor().moverVehiculoNorte();
	}

	public void moverVehiculoAbajo() {
		this.getConductor().moverVehiculoEste();
	}

	public int getCantidadDeMovimientos() {
		return this.miConductor.getCantidadDeMovimientos();
	}

	public int calcularPuntaje() {
		return miDificultad.calcularPuntaje(miConductor.getCantidadDeMovimientos());
	}
	
	public boolean superoCantidadDeMovimientosLimite() {
		return (miDificultad.getMovimientosLimite() < miConductor.getCantidadDeMovimientos());
	}

	public int getCantidadDeMovimientosMaximos() {
		return miDificultad.getMovimientosLimite();
	}
	
	public void setUsuarioActual(String s){
		this.usuario = s;
	}
	
	public String getUsuarioActual(){
		return this.usuario;
	}
	
	public Element serializar(String nombrePartida){
		Element nodoPartida = new Element("Partida");
		
		nodoPartida.setAttribute("nombrePartida", nombrePartida);
		nodoPartida.setAttribute("usuario", this.usuario);
		nodoPartida.addContent(this.miDificultad.serializar());		
		nodoPartida.addContent(this.unMapa.serializar());		
		nodoPartida.addContent(this.miConductor.serializar());
		
		return nodoPartida;
	}
	
	public Partida (Element nodoPartida){
		
		Element nodoDificultad = nodoPartida.getChild("Dificultad");
		if( nodoDificultad.getAttributeValue("tipoDeDificultad").equals("Base")) this.miDificultad = new DificultadBase();
		if( nodoDificultad.getAttributeValue("tipoDeDificultad").equals("Baja")) this.miDificultad = new DificultadBaja();
		if( nodoDificultad.getAttributeValue("tipoDeDificultad").equals("Media")) this.miDificultad = new DificultadMedia();
		if( nodoDificultad.getAttributeValue("tipoDeDificultad").equals("Alta")) this.miDificultad = new DificultadAlta();
		
		
		this.miConductor = new Conductor(nodoPartida.getChild("Conductor"));
		
		this.unMapa = new Mapa(nodoPartida.getChild("Mapa"),miConductor);
		this.unMapa.cargarObstaculos(this.miDificultad.getCantObstaculos());
		this.unMapa.cargarSorpresas(this.miDificultad.getCantSorpresas());
		this.usuario = nodoPartida.getAttributeValue("usuario");
		
		this.cargarConductorEnMapa(miConductor);
		
		
		
	}
		
		
}
